#include <stdlib.h>
#include <video-graphics.h>
#include "window.h"
#include "level.h"
#include <utypes.h>
#include "xpm.h"
#include "anim.h"
#include "physics.h"
#include "game.h"

/** Duração de cada quadro da animação da águia em milisegundos */
#define EAGLE_ANIM_MSEC 500

/** Dados usados pelas callbacks dos inimigos */
struct EnemyData {
	Window win;	/**< Janela */
	Animation anim; /**< Animação */
	Physics phys;	/**< Física */
	LevelSprite ls; /**< Sprite do nível */
	int points; /**< Número de pontos o inimigo vale */
};

/** Callback de exibição da águia
 */
static void eagle_show_cb (Window win, int x, int y, int w, int h, void *data)
{
	enum AnimID id; // Identificador da animação

	struct EnemyData *edata = data;
	if (edata->phys.vx > 1) { // Se a águia está olhando para a direita
		id = ANIM_EAGLE_R;
	} else if (edata->phys.vx < -1) { // Se a águia está olhando para a esquerda
		id = ANIM_EAGLE_L;
	} else { // A águia não está se movendo consideravelmente
		id = edata->anim.id;
	}
	
	// Se a animação não mudou, a continuamos
	if (id == edata->anim.id) {
		xpm_draw (win, anim_continue(&edata->anim), 0, 0);
	} else { // Senão a trocamos
		anim_init (&edata->anim, id, EAGLE_ANIM_MSEC);
		xpm_draw (win, anim_play (&edata->anim), 0, 0);
	}
}

/* Inimigo foi morto */
static void enemy_killed (Window win, void *data)
{
	struct EnemyData *edata = data;

	game_points(edata->points);
	window_delete (win);
}

/** Callback de update da águia */
static void eagle_update_cb (Window win, void *data)
{
	struct EnemyData *edata = data;
	int sx, sy;
	
	physics_eagle (&edata->phys, &sx, &sy);

	window_move (edata->win, sx, sy);
}


/* Cria uma águia */
void eagle_sprite_init (int x, int y, LevelSprite sprite)
{
	// Aloca os dados da águia
	struct EnemyData *data = malloc (sizeof (struct EnemyData));
	// Inicializa 
	anim_init (&data->anim, ANIM_EAGLE_L, EAGLE_ANIM_MSEC);
	XPM xpm = anim_play (&data->anim); // xpm usado para obter o tamanho da janela

	data->ls = sprite;
	data->points = 0;

	// Obtém a posição da janela
	int wx = (x+1) * xpm_level_cell_width - xpm->width;
	int wy = (y+1) * xpm_level_cell_height - xpm->height;

	// Inicializamos a física
	physics_init (&data->phys, PHYS_EAGLE, wx, wy, xpm->width, xpm->height);

	// Criamos a janela
	data->win = window_new (wx, wy, xpm->width, xpm->height, data);
	// Pomos a janela no plano dos inimigos
	window_set_plane (data->win, PLANE_ENEMY);
	// Fazemos a janela liberar a memória que alocamos
	window_set_free (data->win, free);
	// Mostramos a janela
	window_show (data->win, eagle_show_cb);
	// A janela deve ser atualizada
	window_update (data->win, eagle_update_cb);

	// Passamos ao nível os dados sobre este sprite
	level_sprite_init (sprite,
			   data->win,
			   enemy_killed,
			   level_callback_delwin,
			   xpm_level_cell_width,
			   xpm_level_cell_height,
			   data);
}

/** Mostra o dinheiro pequeno */
static WINDOW_DRAW_CB_XPM_ND(money_s_draw_cb,XPM_MONEY_S,0,0)

/* Cria um dinheiro pequeno */
void money_s_sprite_init (int x, int y, LevelSprite sprite)
{
	// Aloca os dados da águia
	struct EnemyData *data = malloc (sizeof (struct EnemyData));
	// Inicializa 
	data->ls = sprite;
	data->points = 10;

	XPM xpm = xpm_get (XPM_MONEY_S);

	// Obtém a posição da janela
	int wx = (x+1) * xpm_level_cell_width - xpm->width;
	int wy = (y+1) * xpm_level_cell_height - xpm->height;

	// Criamos a janela
	data->win = window_new (wx, wy, xpm->width, xpm->height, data);
	// Pomos a janela no plano dos inimigos
	window_set_plane (data->win, PLANE_ENEMY);
	// Fazemos a janela liberar a memória que alocamos
	window_set_free (data->win, free);
	// Mostramos a janela
	window_show (data->win, money_s_draw_cb);

	// Passamos ao nível os dados sobre este sprite
	level_sprite_init (sprite,
			   data->win,
			   enemy_killed,
			   level_callback_delwin,
			   xpm_level_cell_width,
			   xpm_level_cell_height,
			   data);
}



